\section{\href{https://www.apiref.com/cpp-zh/cpp/utility/optional.html}{std::optional}}
\begin{cpp}
//定义于头文件 <optional>
template< class T >
class optional; //(C++17 起)
\end{cpp}
类模板 std::optional 管理一个既可以存在也可以不存在的值。一种常见的 optional 使用情况场景是一个函数，成功返回一个值失败返回另一个值。与 std::pair<T,bool> 相比， optional 在对象构造开销巨大我的场景下表现良好，并更加易读。任何一个 optional<T> 的实例在给定时间点要么含值，要么不含值。若一个 optional<T> 含值，则保证值作为 optional 对象所用空间的一部分分配，即不会发生动态内存分配。从而 optional 对象模拟一个对象，而非指针，尽管定义了 operator*() 和 operator->() 运算符。当一个 optional<T> 对象被按语境转换成 bool 时，若对象含值则转换返回 true ，若对象不含值则返回 false 。optional 对象在下列条件下含值：
\begin{itemize}
\item 对象被以 T 类型的值或另一含值的 optional 初始化/赋值。
对象在下列条件下不含值：
\begin{itemize}
\item 对象被默认初始化。
\item 对象被以 \href{https://www.apiref.com/cpp-zh/cpp/utility/optional/nullopt_t.html}{std::nullopt\_t} 类型值或不含值的 optional 对象初始化/赋值。
\item 调用了成员函数 \href{https://www.apiref.com/cpp-zh/cpp/utility/optional/reset.html}{reset()} 。
\end{itemize}
\end{itemize}
无引用的 optional ：若以引用类型实例化 optional 则程序非良构。不过，可用 T 类型的 std::reference\_wrapper 的 optional 保证引用。另外，若以（可有 cv 限定的）标签类型 std::nullopt\_t 或 std::in\_place\_t 实例化 optional 则程序非良构。

模板形参T：要为之管理状态的值的类型。该类型必须满足可析构 (Destructible) 的要求。（特别是不允许数组类型）
成员类型：value\_type T
\begin{itemize}
    \item \textbf{构造函数}：构造optional对象(公开成员函数)
    \item \textbf{析构函数}：销毁容纳的值，若存在(公开成员函数)
    \item \textbf{operator=}：赋值构造函数(公开成员函数)
    \item \textbf{operator->}：访问所包含的值(公开成员函数)
    \item \textbf{operator*}:访问所含值(公开成员函数)
    \item \textbf{operator bool has\_value}：检查对象是否含值(公开成员函数)
    \item \textbf{value}：返回所含值(公开成员函数)
    \item \textbf{value\_or}：若所含值可用则返回它，否则返回另一个值(公开成员函数)
    \item \textbf{swap}：交换内容(公开成员函数)
    \item \textbf{reset}：销毁任何所含值(公开成员函数)
    \item \textbf{emplace}：原位构造所含值(公开成员函数)
    \item \textbf{operator==(C++17)、operator!= (C++17)、operator<  (C++17)、operator<= (C++17)、operator>  (C++17)、operator>= (C++17)、operator<=>(C++20)}：比较 optional 对象(函数模板)
    \item \textbf{make\_optional(C++17)}：创建一个 optional 对象(函数模板)
    \item \textbf{std::swap(std::optional)(C++17)}：特化 std::swap 算法(函数)
    \item \textbf{std::hash<std::optional>(C++17)}：特化 std::hash 算法(类模板特化)
    \item \textbf{nullopt\_t(C++17)}：带未初始化状态的 optional 类型的指示器(类)
    \item \textbf{bad\_optional\_access(C++17)}：指示进行了到不含值的 optional 的有检查访问的异常(类)
    \item \textbf{nullopt(C++17)}：nullopt\_t 类型对象
    \item \textbf{in\_place、in\_place\_type、in\_place\_index、in\_place\_t、in\_place\_type\_t、in\_place\_index\_t(C++17)}：原位构造标签(类模板)
\end{itemize}
\cppfile{sample/optional_demo.cc}
